package Json;

import java.util.ArrayList;
import java.util.List;

import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;
import com.google.gson.reflect.TypeToken;

/**
 * gson 基本用法。
 * 
 * 反序列化 String fromJson = gson.fromJson("100",String.class)。
 * 
 * 序列化 String json = gson.toJson(100)。
 * 
 * @SerializedName(value = "emailAddress", alternate = { "email",
 *                       "email_address"})
 * 
 * @author zyj
 * 
 */
public class GsonTest1 {
	private static Gson gson;

	public static void main(String[] args) {
		gson = new Gson();

		// commonDataType();

		// pojoDataType();

//		genericityType();
		
		User user = new User(null, 12);
		System.out.println(gson.toJson(user));
	    System.err.println("string str--》int bean  是否可以解析："+gson.fromJson(    "{\"age\":\"1222\"}", User.class).age);
		User user2 = new User();
		user2.setName("ac");
		List<User> mList=new ArrayList<>();
		mList.add(user2);
		mList.add(user2);
		System.out.println(gson.toJson(mList));
	}

	/**
	 * 泛型
	 */
	private static void genericityType() {
		String arrayStr = "[\"Android\",\"Java\",\"PHP\"]";
		String[] fJson = gson.fromJson(arrayStr, String[].class);
		// 但对于List将上面的代码中的 String[].class 直接改为 List<String>.class 是行不通的。
		// 对于Java来说List<String> 和List<User> 这俩个的字节码文件只一个那就是List.class，
		// 这是Java泛型使用时要注意的问题 		泛型擦除。
		for (String string : fJson) {
			System.err.println(string);
		}
		//为了解决的上面的问题，Gson为我们提供了TypeToken来实现对泛型的支持，
		//所以当我们希望使用将以上的数据解析为List<String>时需要这样写
		List<String> stringList = gson.fromJson(arrayStr, new TypeToken<List<String>>() {}.getType());
		//注：TypeToken的构造方法是protected修饰的,所以上面才会写成new TypeToken<List<String>>() {}.getType() 
		//而不是  new TypeToken<List<String>>().getType()
		System.out.println(stringList.toString());
	}

	private static void pojoDataType() {
		User user = new User("阿三", 18);
		// 生成JSON：
		System.out.println(gson.toJson(user));
		// 解析JSON：
		// String jsonString = "{\"name\":\"怪盗kidou\",\"age\":24}";
		// 3个字段都可以解析出 当多种情况同时出时，以最后一个出现的值为准。
		String jsonString = "{\"name\":\"怪盗kidou\",\"age\":24,\"emailAddress\":\"ikidou@example.com111\"}\n";
		// String
		// jsonString="{\"name\":\"怪盗kidou\",\"age\":24,\"email_address\":\"ikidou@example.com222\"}\n";
		// String
		// jsonString="{\"name\":\"怪盗kidou\",\"age\":24,\"email\":\"ikidou@example.com333\"}\n";

		User user2 = gson.fromJson(jsonString, User.class);
		System.out.println(user2.toString());
	}

	/**
	 * 基本数据类型
	 */
	private static void commonDataType() {
		// 反序列化
		String fromJson = gson.fromJson("100", String.class);
		System.out.println(fromJson);

		// 序列化
		String json = gson.toJson(100);
		System.out.println(json);
	}

}

class User {
	public User() {
		
	}

	public User(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public User(String name, int age, String emailAddress) {
		super();
		this.name = name;
		this.age = age;
		this.emailAddress = emailAddress;
	}

	// 省略其它
	@SerializedName("_name")
	public String name;
	public int age;
	@SerializedName(value = "emailAddress", alternate = { "email",
			"email_address" })
	public String emailAddress;

	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + ", emailAddress="
				+ emailAddress + "]";
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getEmailAddress() {
		return emailAddress;
	}

	public void setEmailAddress(String emailAddress) {
		this.emailAddress = emailAddress;
	}

	public String isSex() {
		// TODO Auto-generated method stub
		return null;
	}
	
	


}
